<?php


namespace App\Http\Common;

/**
 * 阶梯收费
 * Class MyFunction
 * @package App\Http\Common
 */
class MyFunction
{
    //创建静态私有的变量保存该类对象
    private static $instance;
    private static $instance2;
    //参数
    public $config;
    //防止直接创建对象
    private function __construct($config){
        $this->config = $config;
    }
    //防止克隆对象
    private function __clone(){
    }
    // 使用单列模式
    public static function getInstance($config=null){
        //没有则创建
        if (!self::$instance instanceof self) {
            self::$instance = new self($config);
        }
        return self::$instance;
    }
    /**
     * 语法数组，标签 对应 逻辑
     * @var array
     */
    public $grammar = [
        '如果'=>'if',
        '小于'=>'<',
        '大于'=>'>',
        '等于'=>'=',
        '否则'=>'else',
        '且'=>'&&',
        '或'=>'||',
        '（'=>'(',
        '）'=>')',
        '{'=>'{',
        '}'=>'}',
    ];

    /**
     * @var array 我的常量
     */
    public $myConstant = [
        '《楼宇层数》'=>'$floor',
        '《车辆排量》'=>'$displacement',
        '《抄表用量》'=>'$floor',
        '《房屋建筑面积》'=>'$build_space',
    ];
    /**
     * @var array 我的变量
     */
    public $myVariable =[
        '金额'=>'$money',
    ];

    /**
     * 产生公式支持的 数值
     * @param array $values
     */
    public function generateFunction(array $values){
        for ($i=0;$i<count($values);$i++){
            $this->grammar['【数值'.($i+1).'】'] = $values[$i];
        }
        $this->grammar = array_merge($this->grammar,$this->myConstant);
        $this->grammar = array_merge($this->grammar,$this->myVariable);
    }

    /**
     *解析语法
     * @param $content 需要解析的内容
     * 比如
     * 如果 (《楼宇层数》小于 【数值1】){
     * 金额 等于 【数值2】;
     * }
     * 否则
     * {
     * 金额 等于 【数值3】+（《楼宇层数》-【数值1】）*【数值4】;
     * }
     * @param array $variables
     * @param string $valuesStr
     * @return mixed
     */
    public function parseGrammar($content, $variables = [
        'floor' => 1, 'displacement' => 1, 'build_space' => 3
    ],$valuesStr = '[]'){
        $variables = $this->dealVariable($variables);
        $this->generateFunction(json_decode($valuesStr));
        $contentStr = str_replace(array_keys($this->grammar),array_values($this->grammar),$content);
        $return = ";return ".$this->myVariable['金额'].';';
        $evalContent = $variables.$contentStr.$return;
        return eval($evalContent);
    }

    /**
     * 处理给变量赋予初始值
     * @param $value
     * @return string
     */
    public function dealVariable($value){
        $str = "";
        foreach ($value as $k=>$v){
            $str .= '$'.$k.'='.$v.';';
        }
        return $str;
    }



}
